/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transactions;

import data.PesquisaData;
import data.PesquisaDispDO;
import data.PesquisaDispData;
import data.FilterDO;
import data.UserDO;
import data.UserData;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import utils.Tabelas;
import utils.Transaction;

/**
 *
 * @author Felipe
 */
public class PesquisaDisp {

    public static int inserir(LinkedList<PesquisaDispDO> lista) {
        int counter = 0;
        Transaction tr = null;
        try {
            tr = new Transaction();
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (tr != null) {
            try {
                for (PesquisaDispDO pd : lista) {
                    try {
                        PesquisaDispData.inserir(pd, tr);
                        counter++;
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if (counter > 0) {
                    tr.commit();
                    return counter;
                } else {
                    tr.rollback();
                }
            } catch (Exception e) {
                tr.rollback();
                e.printStackTrace();
            }
        }
        return 0;
    } // inserir

    public static void popularPorPesquisa(int pesquisa_id) {
        try {
            Transaction tr = new Transaction();
            LinkedList<Integer> lista = UserData.executarQuery(Filter.getQueryToFindUsers(pesquisa_id), tr);
            tr.rollback();
            if (lista.size() > 0) {
                LinkedList<PesquisaDispDO> listapd = new LinkedList<PesquisaDispDO>();
                for (Integer i : lista) {
                    PesquisaDispDO pd = new PesquisaDispDO();
                    pd.setPesquisa_id(pesquisa_id);
                    pd.setUser_id(i);
                    listapd.add(pd);
                }
                inserir(listapd);
            }
        } catch (Exception ex) {
            Logger.getLogger(PesquisaDisp.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /* --------------------------------- */
    /* Incluído por Andrey em 13/11/2011 */
    /* --------------------------------- */
    /* OBS: funcao retornar void eh uma pratica aceitavel em OO? */
    public static void popularPorUsuario(int user_id) {
        /* Cria lista ligada de objetos Integer para receber o ID das
         * pesquisas vigentes; lista ligada de FilterDO para receber os
         * filtros de cada pesquisa e lista ligada de PesquisaDispDO para
         * ser preenchida e inserida no banco de dados.
         */
        LinkedList<Integer> pesquisasEmAndamento = new LinkedList<Integer>();
        LinkedList<FilterDO> filtros = new LinkedList<FilterDO>();
        LinkedList<PesquisaDispDO> populacao = new LinkedList<PesquisaDispDO>();
        UserDO user = new UserDO();
        int count = -1;

        /* Abre uma transacao para conexao com o banco de dados */
        Transaction tr = null;
        try {
            tr = new Transaction();
        } catch (Exception e) {
            e.printStackTrace();
        }

        /* Se conseguiu abrir a transacao, realiza a busca */
        if (tr != null) {
            try {
                /* Lista todas as pesquisas vigentes */
                pesquisasEmAndamento = PesquisaData.pesquisasVigentes(tr);
                for (Integer pa : pesquisasEmAndamento) {
                    System.out.println("Pesq_andamento = " + pa.intValue());
                }

                /* Pega os dados do usuario */
                user = UserData.consultar(user_id, tr);
            } catch (Exception e) {
                System.out.println("Não consegui buscar pesquisas vigentes.");
                e.printStackTrace();
            }
        }

        /* Para cada pesquisa vigente, busca seus filtros */
        for (Integer p : pesquisasEmAndamento) {
            filtros = Filter.buscar(p.intValue()); //Busca filtros para o ID em p
            count = filtros.size();
            if (count == 0) {
                count = -1; //Nao retornou filtros!!!
            }
            /* Para cada filtro, verifica se o user passa:
             *      - Transforma-se o atributo do user a ser confrontado no 
             *        filtro em String;
             *      - O valor do filtro eh uma String;
             *      - Para operacao de '=' e '!', compara-se diretamente as
             *        String;
             *      - Para operação de '>' e '<', faz-se cast INT para comparar
             */
            for (FilterDO f : filtros) {
                System.out.println(count + " id_pesq = " + p.intValue());
                String valor_comp;
                valor_comp = PesquisaDisp.getUserValue(f.getUser_campo(), user);
                switch (f.getOperacao()) {
                    case '=':
                        if (true == valor_comp.equalsIgnoreCase(f.getValor())) {
                            count--;
                        }
                        break;
                    case '!':
                        if (false == valor_comp.equalsIgnoreCase(f.getValor())) {
                            count--;
                        }
                        break;
                    case '>':
                        if (Integer.parseInt(valor_comp) > Integer.parseInt(f.getValor())) {
                            count--;
                        }
                        break;
                    case '<':
                        if (Integer.parseInt(valor_comp) < Integer.parseInt(f.getValor())) {
                            count--;
                        }
                        break;
                }
            }
            /* Se user passou no filtro, preenche a lista com suas pesquisas
             * disponiveis.
             */
            if (count == 0) {
                PesquisaDispDO pesq = new PesquisaDispDO();
                pesq.setUser_id(user_id);
                pesq.setPesquisa_id(p.intValue()); //ID da pesquisa
                populacao.add(pesq);
                System.out.println("Vou inserir " + pesq.getPesquisa_id() + " " + pesq.getUser_id());
            }
        }

        for (PesquisaDispDO op : populacao) {
            System.out.println("Tam_pop = " + populacao.size());
            System.out.println(op.getPesquisa_id() + " " + op.getUser_id());
        }

        /* Por fim, popula a tabela com as pesquisas disponiveis */
        if (populacao != null) {
            PesquisaDisp.inserir(populacao);
        }

    }

    /* Tranforma o dado do usuario definido no campo 'user_campo' da
     * tabela '_filtro' em String
     */
    public static String getUserValue(String campo, UserDO u) {
        String valor = null;

        if (campo.equalsIgnoreCase(Tabelas.USER_ddd)) {
            valor = String.valueOf(u.getDdd());
        }
        if (campo.equalsIgnoreCase(Tabelas.USER_estado_civil)) {
            valor = String.valueOf(u.getEstado_civil());
        }
        if (campo.equalsIgnoreCase(Tabelas.USER_moradia)) {
            valor = String.valueOf(u.getTipo_moradia());
        }
        if (campo.equalsIgnoreCase(Tabelas.USER_profissao)) {
            valor = String.valueOf(u.getProfissao());
        }
        if (campo.equalsIgnoreCase(Tabelas.USER_sexo)) {
            valor = String.valueOf(u.getSexo());
        }
        if (campo.equalsIgnoreCase(Tabelas.USER_renda)) {
            valor = String.valueOf((int) u.getRenda());
        }
        if (campo.equalsIgnoreCase(Tabelas.USER_educacao)) {
            valor = String.valueOf(u.getEducacao());
        }
        if (campo.equalsIgnoreCase(Tabelas.USER_n_pess_resd)) {
            valor = String.valueOf(u.getN_pessoas_residencia());
        }

        /* Eh necessario calcular a idade, pois o banco guarda apenas a data de nascimento */
        if (campo.equalsIgnoreCase(Tabelas.USER_idade)) {
            /* Calula a idade */
            Calendar cData = Calendar.getInstance();
            Calendar cHoje = Calendar.getInstance();
            cData.setTime(u.getData_nasc());
            cData.set(Calendar.YEAR, cHoje.get(Calendar.YEAR));
            int idade = cData.after(cHoje) ? -1 : 0;
            cData.setTime(u.getData_nasc());
            idade += cHoje.get(Calendar.YEAR) - cData.get(Calendar.YEAR);

            valor = String.valueOf(idade); //Parse para String
        }

        return (valor);
    }
}